package com.sheng.leetcode.year2022.month08.day10;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author liusheng
 * @date 2022/08/10
 *
 * 640. 求解方程
 *
 * 求解一个给定的方程，将x以字符串 "x=#value" 的形式返回。该方程仅包含 '+' ， '-' 操作，变量 x 和其对应系数。
 * 如果方程没有解，请返回 "No solution" 。如果方程有无限解，则返回 “Infinite solutions” 。
 * 如果方程中只有一个解，要保证返回值 'x' 是一个整数。
 *
 * 示例 1：
 * 输入: equation = "x+5-3+x=6+x-2"
 * 输出: "x=2"
 *
 * 示例 2:
 * 输入: equation = "x=x"
 * 输出: "Infinite solutions"
 *
 * 示例 3:
 * 输入: equation = "2x=x"
 * 输出: "x=0"
 *
 * 提示:
 *
 * 3 <= equation.length <= 1000
 * equation 只有一个 '='.
 * equation 方程由整数组成，其绝对值在 [0, 100] 范围内，不含前导零和变量 'x' 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/solve-the-equation
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode0640 {

    @Test
    public void test01() {
//        String equation = "x+5-3+x=6+x-2";
//        String equation = "x=x";
//        String equation = "2x=x";
        String equation = "-x=-1";
        System.out.println(new Solution().solveEquation(equation));
    }
}
class Solution {
    public String solveEquation(String equation) {
        //思路：等号两边的表达式分开处理，最后对常数和X系数进行计算
        String[] split = equation.split("=");
        //左边的表达式
        int[] left = simplify(split[0]);
        int[] right = simplify(split[1]);
        if (left[1] == right[1] && left[0] != right[0]) {
            return "No solution";
        } else if (left[1] - right[1] == 0) {
            return "Infinite solutions";
        } else {
            int x = (right[0] - left[0]) / (left[1] - right[1]);
            return "x=" + x;
        }
    }

    /**
     * 处理表达式化简为a + bx的格式
     * @param str 需要进行处理的表达式
     * @return 化简完成的表达式
     */
    public int[] simplify(String str) {
        int[] ints = new int[2];
        //将数组内的值初始化为0
        Arrays.fill(ints, 0);
        char[] chars = str.toCharArray();
        char symbol = '+';
        //坐标
        int index = 0;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '+' || chars[i] == '-') {
                if (i != 0) {
                    String substring = symbol + str.substring(index, i);
                    if (substring.contains("x")) {
                        //x系数的计算
                        if (substring.length() == 2) {
                            //只有两位，意味着要么为-x要么为+x，取前一个字符与1进行拼接即可
                            ints[1] += Integer.parseInt(substring.substring(0, 1) + "1");
                        } else {
                            //否则，为-2x这种，除了后一位全取到作为x的系数
                            ints[1] += Integer.parseInt(substring.substring(0, substring.length() - 1));
                        }
                    } else {
                        //常数的计算
                        ints[0] += Integer.parseInt(substring);
                    }
                }
                symbol = chars[i];
                index = i + 1;
            } else if (i == chars.length - 1) {
                String substring = symbol + str.substring(index);
                if (substring.contains("x")) {
                    //x系数的计算
                    if (substring.length() == 2) {
                        //只有两位，意味着要么为-x要么为+x，取前一个字符与1进行拼接即可
                        ints[1] += Integer.parseInt(substring.substring(0, 1) + "1");
                    } else {
                        //否则，为-2x这种，除了后一位全取到作为x的系数
                        ints[1] += Integer.parseInt(substring.substring(0, substring.length() - 1));
                    }
                } else {
                    //常数的计算
                    ints[0] += Integer.parseInt(substring);
                }
            }
        }
        return ints;
    }
}
